home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / polyview / polyvw31.lha / Polyview3.1 / new / mkproto.c < prev    next >
C/C++ Source or Header  |  1993-06-23  |  4KB  |  140 lines

  1. /* $Header: /usr3/people/gbourhis/pv3/new/RCS/mkproto.c,v 1.1 92/09/18 10:55:26 marca Exp $ */
  2.  
  3. #ifdef RCSLOG
  4. $Log:    mkproto.c,v $
  5.  * Revision 1.1  92/09/18  10:55:26  marca
  6.  * Initial revision
  7.  * 
  8. #endif
  9.  
  10. #include <string.h>
  11. #include <stdio.h>
  12.  
  13. /* mkproto.c
  14.    Marc Andreessen, NCSA
  15.  
  16.    Syntax: ./mkproto filenames
  17.  
  18.    Given filenames for C source files, scans each in turn
  19.    and dumps prototypes for all non-static functions to stdout.
  20.    Assumes reasonable indentation practices are being followed. */
  21.  
  22.  
  23. #define DUMP_LINE(l)                                  \
  24. {                                           \
  25.   int i = strlen(l);                                  \
  26.   if (l[i-2] == ')')                                  \
  27.     {                                          \
  28.       l[i-1] = ';';                                  \
  29.       l[i] = '\n';                                  \
  30.       l[i+1] = '\0';                                  \
  31.     }                                          \
  32.   fprintf (stdout, "%s", l);                              \
  33. }
  34.  
  35.  
  36. /* Copies "source" to "dest", substituting the value of "new" for all */
  37. /* occurrences of the  value "old".  Assumes sizeof(dest) > strlen(source)- */
  38. /* strlen(old)+strlen(new).  Always returns the value of dest. */
  39. char *strsub (char *dest, char *source, char *old, char *new)
  40. {
  41.   char *start, *next;
  42.     
  43.   /* Initialize the pointers to the beginning of their buffers. */
  44.   start = source;
  45.   *dest = '\0';
  46.   
  47.   /* Keep copying as long as there are matches. */
  48.   while (next = strstr(start, old)) {
  49.     /* Copy the part of the source that was skipped over. */
  50.     strncat(dest, start, (size_t) (next-start));
  51.     
  52.     /* Substitute the new string. */
  53.     strcat(dest, new);
  54.     
  55.     /* Change the starting point of our search. */
  56.     start = next + strlen(old);
  57.   }
  58.   
  59.   /* Append the rest of the source. */
  60.   strcat(dest, start);
  61.   
  62.   return dest;
  63. }
  64.  
  65.  
  66. void process_file (char *fname)
  67. {
  68.   FILE *fp;
  69.   char line[240], oldline[240];
  70.   int done;
  71.  
  72.   fp = fopen (fname, "r");
  73.   if (fp == NULL)
  74.     {
  75.       fprintf (stderr, "mkproto: No file %s.\n", fname);
  76.       return;
  77.     }
  78.  
  79.   fprintf (stdout, "/* THIS FILE IS AUTOMATICALLY GENERATED by mkproto. */\n");
  80.  
  81.   /* Dump the filename to a comment. */
  82.   fprintf (stdout, "\n/* %s */\n\n", fname);
  83.  
  84.   while (!feof (fp))
  85.     {
  86.       /* Fetch a new line. */
  87.       fgets (line, 240, fp);
  88.  
  89.       /* Determine whether the line begins a function. */
  90.       if (!(strncmp (line, "main", 4) == 0 ||
  91.             strncmp (line, "void main", 9) == 0 ||
  92.             strncmp (line, "int main", 8) == 0 ||
  93.             strncmp (line, "static", 6) == 0 ||
  94.             strncmp (line, "extern", 6) == 0)
  95.           &&
  96.           ((line[0] >= 'a' && line[0] <= 'z') ||
  97.            (line[0] >= 'A' && line[0] <= 'Z') ||
  98.            (line[0] == '_'))
  99.           &&
  100.           (strstr (line, "(") != NULL))
  101.         {
  102.           /* Make substitutions on the line as appropriate. */
  103.           bcopy (line, oldline, 240);
  104.           strsub (line, oldline, "XmxCallback", "XmxCallbackPrototype");
  105.           bcopy (line, oldline, 240);
  106.           strsub (line, oldline, "XmxEventHandler", 
  107.                   "XmxEventHandlerPrototype");
  108.  
  109.           /* Dump the first line. */
  110.           done = (line[strlen(line)-2] == ')');
  111.           DUMP_LINE (line);
  112.  
  113.           /* While there are lines remaining in this prototype,
  114.              dump them. */ 
  115.           while (!feof (fp) && !done)
  116.             {
  117.               fgets (line, 240, fp);
  118.               done = (line[strlen(line)-2] == ')');
  119.               DUMP_LINE (line);
  120.             }
  121.         }
  122.     }
  123.   
  124.   fclose (fp);
  125.  
  126.   return;
  127. }
  128.  
  129.  
  130. main (int argc, char **argv)
  131. {
  132.   while (--argc)
  133.     {
  134.       ++argv;
  135.  
  136.       /* Here argv[0] is a filename. */
  137.       process_file (argv[0]);
  138.     }
  139. }
  140.